home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Pascal / Book Demos in Pascal / StylDialog / StylDialog.p < prev    next >
Text File  |  1995-05-26  |  5KB  |  186 lines

  1. program StylDialog;
  2.  
  3. (* StylDialog demo by Ingemar Ragnemalm 1995 *)
  4. (* Based on a help system by Cary Torkelson *)
  5.  
  6.     uses
  7. {$IFC UNDEFINED THINK_PASCAL}
  8.         Types, QuickDraw, Fonts, Events, Packages, Menus, Dialogs, Windows,{}
  9.         OSUtils, ToolUtils, OSEvents, Resources, Memory,
  10. {$ENDC}
  11.         QDOffScreen;
  12.  
  13. {    procedure ShowStyledTextDialog (textResourceID: Integer);}
  14.     var
  15.         theType: Integer;
  16.         itemHit: Integer;
  17.         itemhdl: Handle;
  18.         itembox: Rect;
  19.         theDialog: DialogPtr;
  20.         styledTextTEHandle: TEHandle;
  21.         textRect: Rect;
  22.         theScrollbar: ControlHandle;
  23.         numberLinesPerPage: Integer;
  24.  
  25.     procedure ScrollTextToScrollValue;
  26.         var
  27.             oldScroll: Integer;
  28.             newScroll: Integer;
  29.             scrollbarValue: Integer;
  30.     begin
  31.         HLock(Handle(styledTextTEHandle));
  32.  
  33.         oldScroll := styledTextTEHandle^^.viewRect.top - styledTextTEHandle^^.destRect.top;
  34.         scrollbarValue := GetCtlValue(theScrollbar);
  35.         if scrollbarValue = 0 then
  36.             newScroll := 0
  37.         else
  38.             newScroll := TEGetHeight(GetCtlValue(theScrollbar), 0, styledTextTEHandle);
  39.         TEScroll(0, oldScroll - newScroll, styledTextTEHandle);
  40.  
  41.         HUnlock(Handle(styledTextTEHandle));
  42.     end; (*ScrollTextToScrollValue*)
  43.  
  44.  
  45.     procedure ScrollText (theControl: ControlHandle; thePart: Integer);
  46.  
  47.         var
  48.             delta: Integer;
  49.             oldValue: Integer;
  50.  
  51.     begin
  52.         case thePart of
  53.             inUpButton: 
  54.                 delta := -1;
  55.             inDownButton: 
  56.                 delta := 1;
  57.             inPageUp: 
  58.                 delta := -numberLinesPerPage;
  59.             inPageDown: 
  60.                 delta := numberLinesPerPage;
  61.             otherwise
  62.         end; {case}
  63.         if thePart <> 0 then
  64.             begin
  65.                 oldValue := GetCtlValue(theControl);
  66.                 SetCtlValue(theControl, oldValue + delta);
  67.                 ScrollTextToScrollValue;
  68.             end;
  69.     end; (*ScrollText*)
  70.  
  71.  
  72.     function MyDialogFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: Integer): Boolean;
  73.         var
  74.             clickPoint: Point;
  75.             returnValue: Boolean;
  76.             thePart: Integer;
  77.             theControl: ControlHandle;
  78.             chcode: Integer;
  79.  
  80.     begin
  81.         returnValue := false;
  82.         if theEvent.what = mouseDown then
  83.             begin
  84.                 clickPoint := theEvent.where;
  85.                 GlobalToLocal(clickPoint);
  86.                 thePart := FindControl(clickPoint, theDialog, theControl);
  87.                 if theControl = theScrollbar then
  88.                     if thePart = inThumb then
  89.                         begin
  90.                             thePart := TrackControl(theScrollbar, clickPoint, nil);
  91.                             ScrollTextToScrollValue;
  92.                         end
  93.                     else
  94.                         thePart := TrackControl(theScrollbar, clickPoint, @ScrollText);
  95.             end
  96.         else if theEvent.what = keyDown then
  97.             begin
  98.                 chcode := BAnd(theEvent.message, charCodeMask);
  99.                 if (chcode = 13) or (chcode = 3) then
  100.                     begin
  101.                         itemHit := ok;
  102.                         returnValue := true;
  103.                     end;
  104.             end;
  105.         MyDialogFilter := returnValue;
  106.     end; (*MyDialogFilter*)
  107.  
  108.  
  109.     procedure ShowStyledTextDialog (textResourceID: Integer);
  110.         const
  111.             kHelpID = 128;
  112.             kHelpTextTEID = 2;
  113.             kScrollBarID = 4;
  114.         var
  115.             tempRect: Rect;
  116.             textResourceHandle: Handle;
  117.             stylResourceHandle: StScrpHandle;
  118.             maxScrollValue: Integer;
  119.  
  120. (*Get the dialog*)
  121.     begin
  122.         theDialog := GetNewDialog(kHelpID, nil, WindowPtr(-1));
  123.         SetPort(theDialog);
  124. (*Get the user item defining where the text goes.*)
  125.         GetDItem(theDialog, kHelpTextTEID, theType, itemhdl, textRect);
  126. (*Get the scrollbar handle*)
  127.         GetDItem(theDialog, kScrollBarID, theType, Handle(theScrollbar), tempRect);
  128. (*Make a TextEdit record*)
  129.         styledTextTEHandle := TEStylNew(textRect, textRect);
  130. (*Get the 'TEXT'/'styl' resources and insert them into the TextEdit record.*)
  131.         textResourceHandle := GetResource('TEXT', textResourceID);
  132.         stylResourceHandle := StScrpHandle(GetResource('styl', textResourceID));
  133.         HLock(textResourceHandle);
  134.         TEStylInsert(textResourceHandle^, SizeResource(textResourceHandle), stylResourceHandle, styledTextTEHandle);
  135.         HUnlock(textResourceHandle);
  136.         ReleaseResource(textResourceHandle);
  137.         ReleaseResource(Handle(stylResourceHandle));
  138. (*Set scrollbar values depending on the text*)
  139.         numberLinesPerPage := (textRect.bottom - textRect.top) div (TEGetHeight(styledTextTEHandle^^.nLines, 0, styledTextTEHandle) div styledTextTEHandle^^.nLines);
  140.         maxScrollValue := styledTextTEHandle^^.nLines - numberLinesPerPage;
  141.         if maxScrollValue <= 0 then
  142.             HiliteControl(theScrollbar, 255)
  143.         else
  144.             SetCtlMax(theScrollbar, maxScrollValue);
  145. (*Frame the text area and redraw it*)
  146.         tempRect := textRect;
  147.         InsetRect(tempRect, -1, -1);
  148.         FrameRect(tempRect);
  149.         TEUpdate(textRect, styledTextTEHandle);
  150.  
  151.         InitCursor;
  152. (*Run ModalDialog until the user clicks OK*)
  153.         itemHit := 0;
  154.         while itemHit <> ok do
  155.             ModalDialog(@MyDialogFilter, itemHit);
  156.  
  157.         DisposeControl(theScrollbar);
  158.         DisposeDialog(theDialog);
  159.         TEDispose(styledTextTEHandle);
  160.     end; (*ShowStyledTextDialog*)
  161.  
  162.  
  163. (* Standard inits *)
  164.  
  165.     procedure InitToolbox;
  166.     begin
  167. {$IFC UNDEFINED THINK_PASCAL}
  168.         InitGraf(@qd.thePort);
  169.         InitFonts;
  170.         FlushEvents(everyEvent, 0);
  171.         InitWindows;
  172.         InitMenus;
  173.         TEInit;
  174.         InitDialogs(nil);
  175. {$ENDC}
  176.         InitCursor;
  177.     end; (*InitToolbox*)
  178.  
  179.  
  180. (* Main program *)
  181.  
  182. begin
  183.     InitToolbox;
  184.  
  185.     ShowStyledTextDialog(128);
  186. end. (*main*)